<?php
/**
 * $idStatus
 * 1 = active, 2 = not confirmed, 3 = blocked
 * table: status_users;
 * 
 * $idType:
 * 1 = banner, 2 = context, 3 = microblog, 4 = social Network,
 * 5 = video
 * table: adver_types;
 * 
 * $idStatusTransactions:
 * 1 = input, 2 = output
 * table: status_transaction;
 */
class Back_Model_Statistic extends Zend_Db_Table_Abstract 
{   
    protected $_name = 'advertisers';
    
    /**
     * Подсчет сех рекламодателей
     * @return array 
     */
    public function getCountAllAdvertisers() {
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет рекламодателей с учетом текущего статуса
     * @param int $idStatus - текущий статус
     * @return array 
     */
    public function getCountStatusAdvertisrs($idStatus) {
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'))
                       ->where('id_status =?', intval($idStatus));
        return $this->fetchRow($select);
    }               
    
    /**
     * Подсчет общего кол-ва рекламы 
     * @return array 
     */
    public function getCountAllAdvertisements() {
        $this->_name = 'advertisements';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет рекламы с учетом переданного типа
     * @param int $idType - тип рекламы
     * @return array 
     */
    public function getCountTypeAdvertisements($idType) {
        $this->_name = 'advertisements';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'))
                       ->where('id_type_adver =?', intval($idType));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет всех рекламных компаний
     * @return array 
     */
    public function getCountAllCampaigns() {
        $this->_name = 'campaigns';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет всех рекламных компаний с учетом
     * переданного статуса
     * @param int $idStatus - текущий статус
     * @return array 
     */
    public function getCountStatusCampaigns($idStatus) {
        $this->_name = 'campaigns';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'))
                       ->where('id_status =?', intval($idStatus));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет всех публикаторов
     * @return array 
     */
    public function getCountAllPublishers() {
        $this->_name = 'publishers';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет всех публикаторов с учетом
     * переданного статуса
     * @param int $idStatus - текущий статус
     * @return array 
     */
    public function getCountStatusPublishers($idStatus) {
        $this->_name = 'publishers';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'))
                       ->where('id_status =?', intval($idStatus));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет всех сайтов публикатора
     * @return array
     */
    public function getCountAllSites() {
        $this->_name = 'sites';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет всех сайтов публикатора
     * с учетом переданного статуса
     * @param int $idStatus - текущий статус
     * @return array 
     */
    public function getCountStatusSites($idStatus) {
        $this->_name = 'sites';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'))
                       ->where('id_status =?', intval($idStatus));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет всех рекламных мест
     * @return array 
     */
    public function getCountAllAdvSpaces() {
        $this->_name = 'advertising_spaces';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет всех рекламных мест
     * с учетом переданного статуса
     * @param int $idStatus - текущий статус
     * @return array 
     */
    public function getCountStatusAdvSpaces($idStatus) {
        $this->_name = 'advertising_spaces';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'))
                       ->where('id_status =?', intval($idStatus));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет общего баланса всех рекламодателей
     * @return array 
     */
    public function getAdvertisersBalance() {
        $this->_name = 'advertisers';
        $select = $this->select()
                       ->from($this->_name, array('balance' => 'sum(balance)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет общего баланса всех публикаторов
     * @return array 
     */
    public function getPublishersBalance() {
        $this->_name = 'publishers';
        $select = $this->select()
                       ->from($this->_name, array('balance' => 'sum(balance)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет суммы всех транзакций рекламодателей
     * @return array 
     */
    public function getAllAdvPayments() {
        $this->_name = 'transactions_advertisers';
        $select = $this->select()
                       ->from($this->_name, array('payments' => 'sum(amount)'));
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет суммы всех транзакций рекламодателей 
     * за последний месяц
     * @return array 
     */
    public function getLastMonthAdvPayments() {
        $this->_name = 'transactions_advertisers';
        $select = $this->select()
                       ->from($this->_name, array('payments' => 'sum(amount)'))
                       ->where('date >= (now() - interval 1 month)');
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет суммы всех транзакций рекламодателей
     * за сегодняшний день
     * @return array 
     */
    public function getTodayAdvPayments() {
        $this->_name = 'transactions_advertisers';
        $select = $this->select()
                       ->from($this->_name, array('payments' => 'sum(amount)'))
                       ->where('date >= (now() - interval 1 day)');
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет суммы текущего бюджета
     * всех активных компаний
     * @return array 
     */
    public function getCurrentBalanceActiveCampaigns() {
        $select = $this->select()
                       ->from(array('cb' => 'campaigns_budget'),
                              array('reserved_budget' => 'sum(cb.current_budget)'))
                       ->join(array('c' => 'campaigns'),
                                    'c.id = cb.id_campaign', array('c.id_status'))
                       ->where('c.id_status =?', 1)
                       ->setIntegrityCheck(false);
        return $this->fetchRow($select);
                       
    }
    
    /**
     * Выборка всех публикаторов
     * @return array 
     */
    public function getAllPublishers() {
        $select = $this->select()
                       ->from(array('p' => 'publishers'))
                       ->join(array('sp' => 'spec_status'),
                                    'sp.id = p.id_spec_status',
                              array('spec_status' => 'sp.status'))
                       ->setIntegrityCheck(false);
        return $this->fetchAll($select)->toArray();
    }
    
    /**
     * Подсчет суммы общего дохода/вывода средств
     * в зависимости от переданного типа транзакции 
     * @param int $idPublisher
     * @param int $idStatusTransaction - статус транзакции
     * @return array 
     */
    public function getSelectPublisherAmountTransactions($idPublisher, $idStatusTransaction) {
        $select = $this->select()
                       ->from('transactions_publishers', array('sum' => 'sum(amount)'))
                       ->where('id_publisher =?', intval($idPublisher))
                       ->where('id_status_transaction =?', intval($idStatusTransaction))
                       ->setIntegrityCheck(false);
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет суммы дохода указанно публикатора 
     * с контекстной рекламы/баннеров
     * в зависимости от переданного типа
     * @param int $idPublisher 
     * @param int $idType - тип рекламы
     * @return array 
     */
    public function getSelectTypeAmountPublisherTransactions($idPublisher, $idType) {
        $select = $this->select()
                       ->from('transactions_publishers', array('sum' => 'sum(amount)'))
                       ->where('id_status_transaction =?', 1)
                       ->where('id_adv_type =?', $idType)
                       ->where('id_publisher =?', $idPublisher)
                       ->setIntegrityCheck(false);
        return $this->fetchRow($select);
    }
    
    /**
     * Выборка всех рекламодателей
     * @return array 
     */
    public function getAllAdvertisers() {
        $select = $this->select()
                       ->from('advertisers')
                       ->setIntegrityCheck(false);
        return $this->fetchAll($select)->toArray();
    }
    
    /**
     * Подсчет суммы ввода средств/расхода указанного
     * рекламодателя в зависимости от переданного
     * типа транзакции
     * @param int $idTransaction - тип транзакции
     * @param int $idAdvertiser
     * @return array 
     */
    public function getSelectTransactionsAmountAdvertiser($idTransaction, $idAdvertiser) {
        $select = $this->select()
                       ->from('transactions_advertisers', array('sum' => 'sum(amount)'))
                       ->where('id_status_transaction =?', intval($idTransaction))
                       ->where('id_advertiser =?', intval($idAdvertiser))
                       ->setIntegrityCheck(false);
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет суммы выбранного типа рекламы
     * указанного рекламодателя
     * @param int $idAdvertiser
     * @param int $idType - тип рекламы
     * @return array 
     */
    public function getOutputSelectTypeAmountAdvertiser($idAdvertiser, $idType) {
        $select = $this->select()
                       ->from('transactions_advertisers', array('sum' => 'sum(amount)'))
                       ->where('id_adv_type =?', intval($idType))
                       ->where('id_advertiser =?', intval($idAdvertiser))
                       ->where('id_status_transaction =?', 1)
                       ->setIntegrityCheck(false);
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет суммы всего финансового оборота
     * системы за указанный день
     * @param int $day
     * @param int $month
     * @param int $year
     * @return array 
     */
    public function getSelectDayTurnover($day, $month, $year) {
        $this->_name = 'transactions_advertisers';
        $select = $this->select()
                       ->from($this->_name, array('sum' => 'SUM(amount)', 'date', 'id_adv_type'))
                       ->where('DAYOFMONTH(date) =?', $day)
                       ->where('MONTH(date) =?', $month)
                       ->where('YEAR(date) =?', $year);
        return $this->fetchRow($select);
    }
    
    /**
     * Подсчет суммы всего финансового оборота
     * системы за указанный день и указанного типа рекламы     
     * @param int $day
     * @param int $month
     * @param int $year
     * @param int $advType
     * @return array 
     */
    public function getSelectAdvTypeDayTurnover($day, $month, $year, $advType) {
        $this->_name = 'transactions_advertisers';
        $select = $this->select()
                       ->from($this->_name, array('sum' => 'SUM(amount)'))           
                       ->where('DAYOFMONTH(date) =?', $day)
                       ->where('MONTH(date) =?', $month)
                       ->where('YEAR(date) =?', $year)
                       ->where('id_adv_type =?', $advType);
        return $this->fetchRow($select);
    }
}

?>
